package com.homelock.common.util;

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class HttpClientHelper {
    private static final Logger logger = LoggerFactory.getLogger(HttpClientHelper.class);

    @Autowired
    private CloseableHttpClient closeableHttpClient;

    @Autowired
    private RequestConfig requestConfig;

    public String get(String url, HashMap<String, Object> paramMap, HashMap<String, Object> header){
        String result = null;
        if(url == null || "".equals(url)){
            return result;
        }
        // 创建一个request对象
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response = null;
        try{
            // 配置连接参数
            httpGet.setConfig(requestConfig);
            // 设置参数
            if(paramMap != null && paramMap.size() > 0 ){
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                for(Map.Entry<String,Object> entry : paramMap.entrySet()){
                    params.add(new BasicNameValuePair(entry.getKey(), URLEncoder.encode(entry.getValue().toString(), "UTF-8")));
                }
                String strParams = EntityUtils.toString(new UrlEncodedFormEntity(params));
                String realParams = URLDecoder.decode(strParams, "UTF-8");
                httpGet.setURI(new URI(httpGet.getURI().toString().indexOf("?") > 0 ? httpGet.getURI().toString() + "&" + realParams : httpGet.getURI().toString() + "?" + realParams));
            }
            if(header != null && header.size() > 0){
                for(Map.Entry<String,Object> entry : header.entrySet()){
                    httpGet.addHeader(entry.getKey(), entry.getValue().toString());
                }
            }
            // 执行request
            response = closeableHttpClient.execute(httpGet);
            result = parseResponse(response);
        }catch (Exception e){
            logger.error("url:%s,msg:%s",url,e.getMessage());
            httpGet.abort();
        }finally {
            try{
                if(response != null){
                    response.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        return result;
    }

    public String post(String url, HashMap<String, Object> paramMap, HashMap<String, Object> header) {
        String result = null;
        if(url == null || "".equals(url)){
            logger.error("请求接口不能为空");
            return result;
        }
        // 创建一个request对象
        HttpPost httpPost = new HttpPost(url);
        CloseableHttpResponse response = null;
        try{
            // 配置连接参数
            httpPost.setConfig(requestConfig);
            // 设置参数
            if(paramMap != null && paramMap.size() > 0 ){
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                for(Map.Entry<String,Object> entry : paramMap.entrySet()){
                    params.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
                }
                HttpEntity entity = new UrlEncodedFormEntity(params);
                logger.info("请求参数："+ params.toString());
                httpPost.setEntity(entity);
            }
            if(header != null && header.size() > 0){
                for(Map.Entry<String,Object> entry : header.entrySet()){
                    httpPost.addHeader(entry.getKey(), entry.getValue().toString());
                }
            }
            // 执行request
            response = closeableHttpClient.execute(httpPost);
            result = responseHandle(response);
        }catch (Exception e){
            logger.error("url:{},msg:{}",url,e.getMessage());
            httpPost.abort();
        }finally {
            try{
                if(response != null){
                    response.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        return result;
    }


    public String postJSON(String url, String json_str, HashMap<String, Object> header) {
        String result = null;
        if(url == null || "".equals(url)){
            return result;
        }
        // 创建一个request对象
        HttpPost httpPost = new HttpPost(url);
        CloseableHttpResponse response = null;
        try{
            // 配置连接参数
            httpPost.setConfig(requestConfig);
            // 设置参数
            if(json_str != null && !"".equals(json_str) ){
                StringEntity entity = new StringEntity(json_str, ContentType.APPLICATION_JSON);
                entity.setContentEncoding("UTF-8");
                entity.setContentType("application/json");
                httpPost.setEntity(entity);
            }
            if(header != null && header.size() > 0){
                for(Map.Entry<String,Object> entry : header.entrySet()){
                    httpPost.addHeader(entry.getKey(), entry.getValue().toString());
                }
            }
            // 执行request
            response = closeableHttpClient.execute(httpPost);
            result = responseHandle(response);
        }catch (Exception e){
            logger.error("url:%s,msg:%s",url,e.getMessage());
            httpPost.abort();
        }finally {
            try{
                if(response != null){
                    response.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        return result;
    }
    /**
     * 解析 response数据
     * @param response
     * @return
     */
    private String parseResponse(CloseableHttpResponse response){
        String result = "";
        HttpEntity httpEntity = null;
        InputStream inputStream = null;
        try {
            // 获取响应状态
            int statusCode = response.getStatusLine().getStatusCode();
            // 没有正常响应
            if(statusCode < HttpStatus.SC_OK || statusCode >= HttpStatus.SC_MULTIPLE_CHOICES){
                throw new RuntimeException("statusCode : " + statusCode);
            }
            // 获取响应体
            httpEntity = response.getEntity();
            if(httpEntity != null){
                inputStream = httpEntity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
                StringBuffer sb = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null){
                    sb.append(line);
                }
                reader.close();
                result = sb.toString();
            }
        }catch (Exception e){
            logger.error("HttpClientHelper parseResponse error", e);
        }finally {
            if(inputStream != null){
                try {
                    inputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
        return result;
    }


    private String responseHandle(CloseableHttpResponse response) {
        String result = "";
        HttpEntity httpEntity = null;
        try {
            // 获取响应状态
            int statusCode = response.getStatusLine().getStatusCode();
            // 没有正常响应
            if (statusCode < HttpStatus.SC_OK || statusCode >= HttpStatus.SC_MULTIPLE_CHOICES) {
                throw new RuntimeException("statusCode : " + statusCode);
            }
            // 获取响应体
            httpEntity = response.getEntity();
            if (httpEntity != null) {
                result = EntityUtils.toString(httpEntity);
            }
        } catch (Exception e) {
            logger.error("HttpClientHelper reponseHandle error", e);
        } finally {
            try {
                EntityUtils.consume(httpEntity);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

}
